package net.sharpf2.api.info;

import net.sharpf2.api.Globals;

/**
 * Class to handle skill data
 * @author Piotr Gajdowski
 * @author Matty Cov
 */
public class Skills {
    
    /**
     * Gets the "real" skill level.
     * @param skill Use Constants class to indicate from which skill you want to get the current level from.
     * @return  Level of given skill id.
     */
    public static int getCurrentLevel(int skill) {
        return Globals.CLIENT.getSkillLevels()[skill];
    }
    
    /**
     * Gets the current experience.
     * @param skill Use Constants class to indicate from which skill you want to get the current xp from.
     * @return  XP of given skill id.
     */
    public static int getCurrentXP(int skill) {
        return Globals.CLIENT.getSkillExperiences()[skill];
    }
    
    /**
     * Gets the XP to a certain level
     * @param skill ID of skill from constants class
     * @param level Level to get XP to
     * @return XP to asked level
     */
    public static int getXpToLvl(int skill, int level) {
    	if (level < 1 || level > 99) {
            return 0;
        }
    	return Constants.XP_TABLE[level] - getCurrentXP(skill);
    }
    
    /**
     * Gets XP to next Level
     * @param skill ID of skill from constants class
     * @return XP to next Level
     */
    public static int getXpToNextLvl(int skill) {
    	return getXpToLvl(skill, getCurrentLevel(skill) + 1);
    }
    
    /**
     * Gets percent of xp left until next level
     * @param skill ID of skill from constants class
     * @return Double representing percent to next level
     */
    public static double getPercentToNextLvl(int skill) {
    	int lvl = getCurrentLevel(skill);
    	if (lvl == 99) {
            return 0;
        }
    	int total = Constants.XP_TABLE[lvl + 1] - Constants.XP_TABLE[lvl];
    	if (total == 0) {
            return 0;
        }
        int done = getCurrentXP(skill) - Constants.XP_TABLE[lvl];
        return 100D * done / total;
    }
    
    public static class Constants {
        public static final int ATTACK = 0;
        public static final int DEFENCE = 1;
        public static final int STRENGTH = 2;
        public static final int CONSTITUTION = 3;
        public static final int RANGED = 4;
        public static final int PRAYER = 5;
        public static final int MAGIC = 6;
        public static final int COOKING = 7;
        public static final int WOODCUTTING = 8;
        public static final int FLETCHING = 9;
        public static final int FISHING = 10;
        public static final int FIREMAKING = 11;
        public static final int CRAFTING = 12;
        public static final int SMITHING = 13;
        public static final int MINING = 14;
        public static final int HERBLORE = 15;
        public static final int AGILITY = 16;
        public static final int THIEVING = 17;
        public static final int SLAYER = 18;
        public static final int FARMING = 19;
        public static final int RUNECRAFTING = 20;
        public static final int HUNTER = 21;
        public static final int CONSTRUCTION = 22;
        public static final int SUMMONING = 23;
        public static final int DUNGEONEERING = 24;
        
        private static final int[] XP_TABLE = { 0, 0, 83, 174, 276, 388, 512, 650, 801,
    			969, 1154, 1358, 1584, 1833, 2107, 2411, 2746, 3115, 3523, 3973,
    			4470, 5018, 5624, 6291, 7028, 7842, 8740, 9730, 10824, 12031,
    			13363, 14833, 16456, 18247, 20224, 22406, 24815, 27473, 30408,
    			33648, 37224, 41171, 45529, 50339, 55649, 61512, 67983, 75127,
    			83014, 91721, 101333, 111945, 123660, 136594, 150872, 166636,
    			184040, 203254, 224466, 247886, 273742, 302288, 333804, 368599,
    			407015, 449428, 496254, 547953, 605032, 668051, 737627, 814445,
    			899257, 992895, 1096278, 1210421, 1336443, 1475581, 1629200,
    			1798808, 1986068, 2192818, 2421087, 2673114, 2951373, 3258594,
    			3597792, 3972294, 4385776, 4842295, 5346332, 5902831, 6517253,
    			7195629, 7944614, 8771558, 9684577, 10692629, 11805606, 13034431 };
    }
    
}
